package mat.xls;

import data.obj.Repair;
import jxl.Cell;
import jxl.CellType;
import jxl.Sheet;
import jxl.Workbook;
import jxl.format.CellFormat;
import jxl.read.biff.BiffException;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ExcelParser {
    public static void main(String[] args) throws BiffException, IOException {
        File priceFile = new File("data/price/forward_price_1.xls");
//        File priceFile = new File("data/phones/phones.xlsx");

        List<Part> parts = parsePartsPrice(priceFile, 1.5);
        for (Part part : parts) {
            System.out.println(part);
        }
//        File priceFile = new File("xls/ПРАЙС на ПУ ковры салона1.xls");
//        File priceFile = new File("newxls/ПРАЙС на ПУ ковры салона30.xls");
//        List<Mat> mats = parseMatPrice(priceFile, "Коврик ", 1.5);
//        for (Mat mat : mats) {
//            System.out.println(mat);
//        }
//        System.out.println("---------------------------------------------------------");
//        priceFile = new File("xls/ПРАЙС на ПУ поддоны1.xls");
//        mats = parseMatPrice(priceFile, "Коврик в багажник ");
//        for (Mat mat : mats) {
//            System.out.println(mat);
//        }
//        System.out.println("---------------------------------------------------------");
//        priceFile = new File("xls/ПРАЙС на брызговики ПУ1.xls");
//        List<Mud> muds = parseMudPrice(priceFile);
//        for (Mud mud : muds) {
//            System.out.println(mud);
//        }
    }

    private static List<Part> parsePartsPrice(File priceFile, double coef) throws BiffException, IOException {
        Workbook workbook = Workbook.getWorkbook(priceFile);
        int sheets[] = new int[]{3, 4, 5, 6, 7, 8};
        List<Part> parts = new ArrayList<Part>();
        String category1 = "default";
        String category2 = "default";
        for (int sheetNum : sheets) {
            Sheet sheet = workbook.getSheet(sheetNum);
            for (int j = 3; j < Integer.MAX_VALUE; j++) {
                Cell testCell;
                try {
                    testCell = sheet.getCell(1, j);
                } catch (ArrayIndexOutOfBoundsException e) {
                    break;
                }
                CellFormat cellFormat = testCell.getCellFormat();
                if (cellFormat == null) {
                    continue;
                }
                int value = cellFormat.getBackgroundColour().getValue();
                if (value == 54) {
                    category1 = testCell.getContents();
                    continue;
                } else if (value == 22) {
                    category2 = testCell.getContents();
                    continue;
                }
                Part part = new Part();
                part.originalNumber = sheet.getCell(2, j).getContents();
                part.year = sheet.getCell(3, j).getContents();
                part.name = processName(sheet.getCell(4, j).getContents());
                double initPrice = Double.parseDouble(sheet.getCell(5, j).getContents().replace(",", "."));
                part.price = (int) Math.round((initPrice * coef) / 100) * 100;
                part.category1 = category1;
                part.category2 = category2;
                System.out.println(part);
            }
        }
        return parts;
    }

    private static String processName(String name) {
        name = name.toLowerCase();
        name = name.replace("фара противотум прав", "фара правая противотуманная");
        name = name.replace("фара противотум лев", "фара левая противотуманная");
        name = name.replace("фары противотум лев", "левой противотуманной фары");
        name = name.replace("фары противотум прав", "правой противотуманной фары");
        name = name.replace("бампер передн", "бампер передний");
        name = name.replace("бампер задн", "бампер задний");
        name = name.replace("бампера передн", "переднего бампера");
        name = name.replace("бампера задн", "заднего бампера");
        name = name.replace("с отв п/омыват", "с отверстием под омыватель");
        name = name.replace("крыло передн лев", "крыло левое переднее");
        name = name.replace("крыло передн прав", "крыло правое переднее");
        name = name.replace("зеркало лев электр с подогрев", "левое зеркало с электроподогревом");
        name = name.replace("зеркало прав электр с подогрев", "правое зеркало с электроподогревом");
        name = name.replace("зеркало лев", "левое зеркало");
        name = name.replace("зеркало прав", "правое зеркало");
        name = name.replace("зеркала лев", "левого зеркала");
        name = name.replace("зеркала прав", "правого зеркала");
        name = name.replace("фонарь задн внешн лев", "задний левый фонарь (левая задняя фара)");
        name = name.replace("фонарь передн внешн лев", "задний левый фонарь (левая задняя фара)");
        name = name.replace("фонарь задн внешн прав", "задний правый фонарь (правая задняя фара)");
        name = name.replace("фонарь передн внешн прав", "задний правый фонарь (правая задняя фара)");
        name = name.replace("стекло фары лев", "стекло левой фары");
        name = name.replace("стекло фары прав", "стекло правой фары");
        name = name.replace("указ.поворота", "указатель поворота");
        name = name.replace("указ.поворота угловой лев", "указатель поворота угловой левый");
        name = name.replace("указ.поворота угловой прав", "указатель поворота угловой правый");
        name = name.replace("подкрылок передн крыла лев", "подкрылок переднего левого крыла");
        name = name.replace("подкрылок передн крыла прав", "подкрылок переднего правого крыла");
        name = name.replace("петля капота лев", "петля капота левая");
        name = name.replace("петля капота прав", "петля капота правая");
        name = name.replace("крепление фары лев метал", "крепление левой фары металлическое");
        name = name.replace("крепление фары прав метал", "крепление правой фары металлическое");
        name = name.replace("электр с подогрев", "с электроподогревом");
        name = name.replace("молдинг заднего бампера лев", "левый молдинг заднего бампера");
        name = name.replace("молдинг заднего бампера прав", "правый молдинг заднего бампера");
        name = name.replace("молдинг заднего бампера централ", "центральный молдинг заднего бампера");
        name = name.replace("конденсатор кондиц", "конденсатор кондиционера");
        name = name.replace("(см.каталог)", "");
        name = name.replace("радиатор охлажден", "радиатор охлаждения");
        name = name.replace("{рамка фары противотуманой} лев черн", "рамка левой противотуманой фары черного цвета");
        name = name.replace("{рамка фары противотуманой} прав черн", "рамка правой противотуманой фары черного цвета");
        name = name.replace("фара лев двухламп", "левая фара двухламповая");
        name = name.replace("фара прав двухламп", "правая фара двухламповая");
        name = name.replace("фара лев п/корректор", "фара левая с корректором");
        name = name.replace("фара прав п/корректор", "фара правая с корректором");
        name = name.replace("указатель поворота угловой лев бел", "левый угловой указатель поворота белого цвета");
        name = name.replace("указатель поворота угловой прав бел", "правый угловой указатель поворота белого цвета");
        name = name.replace("компрессор кондиц", "компрессор кондиционера");
        name = name.replace("рычаг передн подвески лев нижн", "левый нижний рычаг передней подвески");
        name = name.replace("рычаг передн подвески прав нижн", "правый нижний рычаг передней подвески");
        name = name.replace("бампер передний нижн , п/противотум", "передний бампер с отверстиями под противотуманные фары");
        name = name.replace("брызговик передн крыла л+п", "брызговик переднего крыла левого+правого");
        name = name.replace("капот металл", "капот металлический");
        name = name.replace("пластик", "из пластика");
        name = name.replace("черн", "черного цвета");
        name = name.replace("бел", "белого цвета");
        name = name.replace("с подогрев", "с подогревом");
        name = name.replace("п/крюк", "с отверстием под крюк");
        name = name.replace("с корпус", "с корпусом");
        name = name.replace("с осушит.", "с осушителем");
        name = name.replace("без осушит.", "без осушителя");
        name = name.replace("радиат охлажден", "радиатор охлаждения");
        name = name.replace("фара лев", "фара левая");
        name = name.replace("фара прав", "фара правая");
        name = name.replace("праваяая", "правая");
        return name;
    }

    public static List<Mat> parseMatPrice(File priceFile, String namePrefix, double coef) throws IOException, BiffException {
        Workbook workbook = Workbook.getWorkbook(priceFile);
        Sheet sheet = workbook.getSheet(0);
        List<Mat> mats = new ArrayList<Mat>();
        String currCategory = "Unknown";
        for (int j = 3; j < Integer.MAX_VALUE; j++) {
            try {
                if (sheet.getCell(0, j).getType() == CellType.EMPTY) {
                    continue;
                }
                if (sheet.getCell(1, j).getType() == CellType.EMPTY) {
                    currCategory = sheet.getCell(0, j).getContents();
                    if (currCategory.toLowerCase().contains("универсальные")) {
                        break;
                    }
                    continue;
                }
                Mat mat = new Mat();
                mat.category = currCategory;
                mat.model = sheet.getCell(1, j).getContents();
                mat.model = fixModel(mat.model);
                double initPrice = Double.parseDouble(sheet.getCell(2, j).getContents().replace(",", "."));
                mat.price = (int) Math.round((initPrice * coef) / 100) * 100;
                mat.name = namePrefix + mat.model;
                mats.add(mat);
            } catch (ArrayIndexOutOfBoundsException e) {
                break;
            }
        }
        return mats;
    }

    private static String fixModel(String model) {
        if (model.equalsIgnoreCase("isusu")) {
            return "ISUZU";
        } else if (model.equalsIgnoreCase("briliance")) {
            return "BRILLIANCE";
        }
        return model;
    }

    private static List<Mud> parseMudPrice(File priceFile, double coef) throws IOException, BiffException {
        Workbook workbook = Workbook.getWorkbook(priceFile);
        Sheet sheet = workbook.getSheet(0);
        List<Mud> muds = new ArrayList<Mud>();
        for (int j = 1; j < Integer.MAX_VALUE; j++) {
            try {
                Mud mud = new Mud();
                double initPrice = Double.parseDouble(sheet.getCell(9, j).getContents().replace(",", "."));
                mud.price = (int) (initPrice * coef);
                mud.name = sheet.getCell(1, j).getContents();
                mud.count = sheet.getCell(2, j).getContents();
                muds.add(mud);
            } catch (ArrayIndexOutOfBoundsException e) {
                break;
            }
        }
        return muds;
    }

    public static List<Repair> parseRepair(String path, int price) throws BiffException, IOException {
        Workbook workbook = Workbook.getWorkbook(new File(path));
        Sheet sheet = workbook.getSheet(0);
        List<Repair> phones = new ArrayList<Repair>();
        for (int j = 0; j < Integer.MAX_VALUE; j++) {
            String vendor = null;
            try {
                vendor = sheet.getCell(j, 0).getContents();
            } catch (ArrayIndexOutOfBoundsException e) {
                break;
            }
            if (vendor.length() == 0) {
                break;
            }
            Repair repair = new Repair();
            repair.vendor = vendor;
            repair.price = price;
            repair.count = 100;
            List<String> models = new ArrayList<String>();
            for (int i = 1; i < Integer.MAX_VALUE; i++) {
                String model = null;
                try {
                    model = sheet.getCell(j, i).getContents();
                } catch (ArrayIndexOutOfBoundsException e) {
                    break;
                }
                if (model.length() == 0) {
                    break;
                }
                models.add(model);
            }
            repair.models = models;
            phones.add(repair);
        }
        Collections.sort(phones);
        return phones;
    }
}
